-- 游戏中的事件总线，对象间的通信靠它完成

-- 模块定义
local M = 
{
    _base_class = require "objects.Object",
    _class_name = "events.Eventbus"
};
setmetatable (M, {__index = _G;});
_ENV = M;

-- 引用模块
local Map = require "collections.Map";
local Map_safe_iter = require "collections.MapSafeIter"

-- 方法定义

-- 为名为event_name的事件添加回调函数event_listener，传入的event_listener
-- 是函数，其接受base_event或其子类对象为参数
function RegisterEvent (event_name, event_listener)
    local listeners = _GetEventListeners (event_name, true);

    if not listeners:ContainsKey (event_listener) then
        listeners:Add (event_listener, event_listener);
    end;

end;

-- 为名为event_name的事件移除回调函数event_listener
function RmvEvent (event_name, event_listener)
    local listeners = _GetEventListeners (event_name, false);
    if listeners ~= nil then
        listeners:Rmv (event_listener);
    end;
end;

-- 派发事件
function DispatchEvent (base_event)
    local listeners = _GetEventListeners (base_event:GetName (), false);
    listeners:BeginIter ();
    for _key, _listener in listeners:GetIter () do
        _listener (base_event);
    end; 
    listeners:EndIter ();
end;

-- 获得名为event_name的事件的回调函数列表，不存在时，若create_if_none
-- 为true，则创建新列表并返回，否则返回nil
function _GetEventListeners (event_name, create_if_none)
    local listener_map = m_listeners:GetItem (event_name);
    if (not listener_map) and create_if_none then
        listener_map = Map_safe_iter.NewMapSafeIter ();
        m_listeners:Add (event_name, listener_map);
    end;   
    return listener_map;
end;

-- 属性定义
m_listeners = Map.NewMap (); 

return M;
